#!/usr/bin/enr/python3
# -*- coding: utf-8 -*-
# -------------------------------
# @Author : hurong
# @File : 02list_demo.py
# @Time : 2023/6/18 15:57
# -------------------------------
'''
列表的定义：
1.列表是有序的可变元素的集合，使用中括号[]包围，元素之间用逗号分割
2.列表是动态的，可以随时扩展和收缩
3.列表是异构的，可以同时存放不同类型的对象
4.列表中允许出现重复元素
'''

# -------------创建列表----------------
# 通过构造函数创建
# 中括号创建并填充
# 列表推导式
# 1. 构造方法 list()
# li = list()
# print(type(li), li)
# li1 = list("hogwarts")
# #  2. 中括号填充元素 []
# li2 = [1, 2, 3]
# li3 = ['hogwarts', 'hello']
# li4 = [1, 3.14, 'hogwaits','hello']
# print(li4)
#
# # 3. 列表推导式
# li5 = [i for i in range(1, 10) if i % 2 == 0]
# print(type(li5), li5)
#
# """列表使用：索引"""
# li6 = [1, 2, 3, 4, 5, 6]
# # 正向索引
# print(li6[2])
# # 反向索引
# print(li6[-4])
'''列表使用：切片'''
"""
切片：[start:stop:step]
# start值：指示开始索引值，没有指定，默认为0
# stop值：指示倒那个索引值结束，没有指定，默认列表允许的最大索引值；
# step：步长值，没有指定，默认步长为1
# 三个值都是可选项，不指定，默认是默认值
"""
# li = ['h', 'o', 'g', 'w', 'a', 'r', 't', 's']
# # 从第一位到第六位，间隔1位（即步长2）进行取数
# print(li[0:5:2])
# # 省略了step,打印['g','w']
# print(li[2:4])
# # 省略start 和stop,打印['h', 'g', 'a', 't']，
# # 从索引值0至列表长度列表索引值7以步长2开始取值
# print(li[::2])
# # 特殊的切片写法：逆序打印
# # 从索引值0至列表长度列表索引值7以步长1开始取值
# print(li[::-1])
#
# '''
# # 重复
# #    使用*运算符可以重复生成列表元素
# # 合并
# #   使用+加号运算符，可以降两个列表合二为一
# '''
# li2 = [1] * 5
# print(li2)
#
# # 合并
# li3 = [1,2,3]
# li4 = [5,6,7]
# print(li3 + li4)
#
# """ 列表的使用：成员检测"""
# # 1 in
# li5 = [1, 2, 3]
# print(1 in li5)
# print(100 in li5)
#
# print(1 not in li5)
# print(100 not in li5)

"""列表方法：
append()--append(item):将一个对象item添加至列表的末尾。入参：对象item；返回：None

extend()--extend(iterable):将一个可迭代对象的所有元素，添加至列表末尾。入参：可迭代对象iterable;返回：None

insert()--将一个对象插入到指定的索引位置；
# 入参：索引值index，一个对象item；返回：None；
# 原索引位置及后面的元素后移一位
pop()--pop(index)或pop()
# 弹出并返回所指定的索引的元素
# 入参：索引值index，可不传
# 返回：返回指定索引的元素；未指定索引则返回末尾元素
# 如果索引值不争气，或者列表已经为空，则引发 IndexError错误

remove()--remove(item)移除列表中第一个等于item的元素；
# 入参：指定元素item；
# 返回：None
# 目标元素必须存在，否则会报错ValueError

sort()--sort(key=None,reverse=False_
# 对列表进行原地排序，只是用<来进行各项间比较。
# 入参：支持2个关键字参数，key:指定带有一个参数的函数，用于从每个列表元素中提取比较键。
# reverse：默认值是False，表示升序；True表示降序。
# 返回：None

reverse()--表示将列表中的元素顺寻反转。
# 参数：无
# 返回：None
# 反转只是针对索引值，元素之间不相互比较。

"""

# # insert(index，item)方法
# li8 = [0, 1, 2]
# # insert插入前： [0, 1, 2]
# print("insert插入前：", li8)
#
# # 在索引0的位置插入元素
# li8.insert(0,'hogwarts')
# # 插入后： ['hogwarts', 0, 1, 2]
# print("插入后：",li8)
# # ['hogwarts', 'hello', 0, 1, 2]
# li8.insert(1,'hello')
# print(li8)
#
# # pop(index)
# # ['hogwarts', 'hello', 0, 1, 2]
# print(li8)
# # ['hogwarts', 0, 1, 2]
# li8.pop(1)
# print(li8)
# # 2 ['hogwarts', 0, 1]
# data = li8.pop()
# print(data, li8)

"""
Traceback (most recent call last):
  File "D:\study\Huogewozi\git_prac\git-demo\pythonCode\list_demo.py", line 121, in <module>
    li8.pop(99)
IndexError: pop index out of range
"""
# li8.pop(99)
# print(li8)

"""空列表进行pop方法

"""
# Traceback (most recent call last):
#   File "D:\study\Huogewozi\git_prac\git-demo\pythonCode\02list_demo.py", line 134, in <module>
#     kong.pop()
# IndexError: pop from empty list
# kong = []
# kong.pop()

# remove(item)
# li9=['a', 'b', 'c', 'd']
# li9.remove('d')
# print(li9)
#
# # remove不存在的值，会报错一场
# '''Traceback (most recent call last):
#   File "D:\study\Huogewozi\git_prac\git-demo\pythonCode\02list_demo.py", line 163, in <module>
#     li9.remove('d')
# ValueError: list.remove(x): x not in list'''
# li9.remove('d')
# print(li9)

# sort()
paixu = [1,3,5,7,9]
paixu.sort()
# [1, 3, 5, 7, 9]
print(paixu)
paixu.sort(reverse=True)
# [9, 7, 5, 3, 1]
print(paixu)

# 按照字符串长度来排序
ll = ['Python', 'java', 'Go','C++']
# ['Go', 'C++', 'java', 'Python']
ll.sort(key = len)
print(ll)
# ['Python', 'java', 'C++', 'Go']
ll.sort(key = len, reverse=True)
print(ll)

# reverse()
li11 = ['a', 'c','b']
li11.reverse()
# ['b', 'c', 'a']
print(li11)

"""列表嵌套"""
li21 = [[1,2,3], ['hogwarts', 'hello', 'python']]
# 输出 python
print(li21[1][2])
li21[1].append('Go')
# 打印：[[1, 2, 3], ['hogwarts', 'hello', 'python', 'Go']]
print(li21)

"""列表推导式"""
# 列表推导式是指循环创建列表，相当于for循环创建列表的简化版
# 语法：[x for x in li if x ...]

"""
实例：将1-10中的所有偶数平方后组成新的列表
"""
# # 方法一：
# result = []
# for item in range(1,11):
#     if item % 2 ==0:
#         result.append(item ** 2)
# #         [4, 16, 36, 64, 100]
# print(result)

# 方法二：[表达式 for 变量 in 列表]  或者[表达式 for 变量 in 列表 if 条件]
result = [item**2 for item in range(1,11) if item %2 == 0]
print(result)

# 例子2：过掉长度小于等于3的字符串列表，并将剩下的转换成大写字母
names = ['Bob', 'Emily', 'Happy', 'LemonTree', 'Tom']
newnames = [name.upper() for name in names if len(name)>3]
print(newnames)

# 例子3. 计算30以内可以被3整除的整数
num = [i for i in range(30) if i %3 == 0]
print(num)
